package com.fjwt.gz.components.mq.model;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fjwt.gz.components.mq.constant.MQSendTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
*
* 定义MQ消息格式
* 业务场景： 越减越便宜消费[ 参与活动后发放卡券 ]
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Acte017SendCouponMQ extends AbstractMQ {

    /** 【！重要配置项！】 定义MQ名称 **/
    public static final String TOPIC_NAME = "SEND_COUPON_ACTE017";
    public static final String GROUP_NAME = "SEND_COUPON_ACTE017_GROUP";

    /** 内置msg 消息体定义 **/
    private MsgPayload payload;

    /**  【！重要配置项！】 定义Msg消息载体 **/
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class MsgPayload {

        /**
         * 用户ID
         */
        private Long fansId;

        /**
         * 活动ID
         */
        private Long activityId;

        /**
         * 应用appid
         */
        private String appId;

        /**
         * 机构号
         */
        private String locationAgentNo;

        /**
         * 额外信息Json
         */
        private String extJson;

        /**
         * 缓存数据过期时间
         */
        private Long redisOutTime;

        /**
         * 活动公众号渠道码ID
         */
        private Long activityChannelId;

        /**
         * 活动结束时间
         */
        private Date activityEndTime;

        /**
         * 用户是否参与福分奖励
         */
        private Boolean firstJoin;

        /**
         * 用户参与次数bo
         */
        private ActivityUserTimesBO activityUserTimesBO;

        /**
         * 用户实名信息
         */
        private FansAuthEntity fansAuthEntity;

        @Data
        public static class ActivityUserTimesBO {

            /**每人参与的总次数*/
            private int totalJoinTimes;

            /**当前周期性参与次数*/
            private int currentPeriodTimes;

            /**当前周期*/
            private int currentPeriod;

            /**分享成功增加的次数*/
            private int shareAddTimes;
        }

        @Data
        public static class FansAuthEntity {
            /**
             * 唯一标识
             */
            private String cstmNo;

            /**
             * 机构ID
             */
            private String agentNo;
        }

    }

    @Override
    public String getMQName() {
        return TOPIC_NAME;
    }

    /**  【！重要配置项！】 **/
    @Override
    public MQSendTypeEnum getMQType(){
        return MQSendTypeEnum.QUEUE;  // QUEUE - 点对点 、 BROADCAST - 广播模式
    }

    @Override
    public String toMessage() {
        return JSONObject.toJSONString(payload);
    }

    /**  【！重要配置项！】 构造MQModel , 一般用于发送MQ时 **/
    public static Acte017SendCouponMQ build(MsgPayload msgPayload){
        return new Acte017SendCouponMQ(msgPayload);
    }

    /** 解析MQ消息， 一般用于接收MQ消息时 **/
    public static MsgPayload parse(String msg){
        return JSON.parseObject(msg, MsgPayload.class);
    }

    /** 定义 IMQReceiver 接口： 项目实现该接口则可接收到对应的业务消息  **/
    public interface IMQReceiver{
        void receive(MsgPayload payload);
    }

}
